package config

import (
	"github.com/fsnotify/fsnotify"
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
)

type Config struct {
	Sort int //排序，用于多个配置文件的加载
	Name string
}

func New(fileNames ...string) {
	for key, fileName := range fileNames {
		c := Config{
			Sort: key,
			Name: fileName,
		}
		// 初始化配置文件
		if err := c.setConfig(); err != nil {
			//初始化错误了直接退出程序
			panic("初始化配置文件出错" + err.Error())
		}
		c.watchConfig()
	}
}

func (c *Config) setConfig() error {
	// 设置配置文件路径
	viper.AddConfigPath("./configs/")

	// 设置配置文件格式为YAML
	viper.SetConfigType("yaml")

	// 设置配置文件名字
	viper.SetConfigName(c.Name)

	// viper解析配置文件，当需要加载多个配置文件的时候，后面的只能merge到进去，不然会形成覆盖
	if c.Sort == 0 {
		if err := viper.ReadInConfig(); err != nil {
			return err
		}
	} else {
		if err := viper.MergeInConfig(); err != nil {
			return err
		}
	}

	return nil
}

// 监听配置文件是否改变,用于热更新
func (c *Config) watchConfig() {
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		logrus.Printf("配置文件修改更新: %s\n", e.Name)
	})
}
